# myFn_Project_vs2012 MakeFile
#
#	要求使用 4.7.1 以上(建议4.8.1以上)的 g++ 编译器 
#	本人编译测试环境为:  
#		x86 : fedora18 , g++ 4.7.2-8.fc18
#		x64	: fedora19 , g++ 4.7.2
#		x86 : ubuntu12.04 , g++ 4.8.2
#
#	目前这个MakeFile尚处于测试状态.
#	另外,由于此makefile不支持自动检测头文件更改,所以,请每次编译前先执行 make clean 或 make cleanall
#
#	另外: make > log.txt 2>&1 可以将输出重定向到文件中. 注意:  2>&1 中间不能有空格
#
#	此makefile有自动推断当前操作系统是32位还是64位的能力,一般情况下并不需要使用 x86 和 x64 参数.
#	这2个参数只有在自动推断失败的情况下才使用.
#
#编译参数: (可选)
#
#	x64=1			编译64位版本 (保证编译64位版本)
#	x86=1			编译32位版本 (保证编译32位版本)
#	debug=1 		编译debug版本 (没有则表示编译release版本)
# *	unicode=1		编译 Unicode版本 (没有则表示编译ascii版本)
# *	share=1			编译动态库版本 (没有则表示编译静态库版本)		
# *	with_mysql=1	编译mysql相关文件.(由于mysql需要使用外部动态库,故默认情况下不编译mysql相关文件) 
#	name=xxxx		编译的文件的名字(文件前缀) (没有则自动设置为 myFn )
#	noflags=1		最终生成的文件名不带描述后缀. 即: 没有 _x64wd 这几个字眼.
#	clean			清空当前编译条件下的临时文件.(不会删除生成的程序文件)
#	cleanall		清空所有临时文件.(不会删除生成的程序文件)
#
#	注意:		1) 带有 * 的参数暂不可用.
#				2) x86 和 x64 是一对矛盾参数,不可同时存在.但2个参数都是可选的.
#				3) 如果 x86 和 x64  同时不存在,则将自动根据当前操作系统版本设置 x86 或 设置x64
#					如果两个参数其中一个存在,则不会进行操作系统版本推断.	
#
#示例:
#	make			: (什么参数也不加) 编译:(release,x86,ascii,static)
#	make debug=1 x64=1 static=1 	: 编译:(debug,x64,ascii,static)
#
#各版本文件后缀说明: 
#	release	:	无
#	ascii	:	无
#	x86		:	无
#	static	:	后缀  .a
#	debug	:  	d			如果 noflags=1 ,则这个值为 空
#	unicode	:	w			如果 noflags=1 ,则这个值为 空
#	x64		:	x64			如果 noflags=1 ,则这个值为 空
#	share	:	后缀: .so
#
#举例: 假如生成的文件名是 myFn (name=myFn)
#         x64   unicode   debug   share  文件名
#   0     [ ]      [ ]    [ ]      [ ]   myFn.a
#   1     [*]      [ ]    [ ]      [ ]   myFn_x64.a	
#   2     [ ]      [*]    [ ]      [ ]   myFn_w.a	
#   3     [*]      [*]    [ ]      [ ]   myFn_x64w.a
#   4     [ ]      [ ]    [*]      [ ]   myFn_d.a
#   5     [*]      [ ]    [*]      [ ]   myFn_x64d.a 	
#   6     [ ]      [*]    [*]      [ ]   myFn_wd.a
#   7     [*]      [*]    [*]      [ ]   myFn_x64wd.a
#   8     [ ]      [ ]    [ ]      [ ]   myFn.so
#   9     [*]      [ ]    [ ]      [*]   myFn_x64.so	
#   10    [ ]      [*]    [ ]      [*]   myFn_w.so	
#   11    [*]      [*]    [ ]      [*]   myFn_x64w.so
#   12    [ ]      [ ]    [*]      [*]   myFn_d.so
#   13    [*]      [ ]    [*]      [*]   myFn_x64d.so 	
#   14    [ ]      [*]    [*]      [*]   myFn_wd.so
#   15    [*]      [*]    [*]      [*]   myFn_x64wd.so
#
#
#
#

##==== 这里可以对 MakeFile 文件进行配置 =======================

##-- 设置根目录
ROOT_DIR := ./

##编译器
CC = g++ 

##==== 设置默认参数


#-- 设置生成的文件默认文件名,即:当无 name 参数时默认的名字
PROJ_NAME := myFn

##-- 设置 mysql 所在路径.
MYSQL_PATH	:= $(ROOT_DIR)../../vc_lib/

##-- 设置 include 目录
##-- 格式: 以  -I 开头,后面直接跟路径. 如路径有空格,则使用双引号.
INCLUDE 		:= 	-I$(ROOT_DIR)include

					
##-- 设置链接库路径
##-- 编译时路径: 即:程序在编译期间搜索的包含动态库的路径.
##-- 如果一个动态库不在当前目录(MakeFile所在目录),也没有写出完整的路径,则需要设置这个值.
##-- 格式: -L 路径  如:  -L./so
LIBS_LINK_PATH	:=

##-- 运行时路径: 即:程序在运行期间搜索的包含动态库的路径.
#--- 只能设置一个. 默认是当前目录.
LIBS_RUN_PATH	:= .



##-- 设置过滤列表(需要跳过的文件)
##		示例:  -path dir1 -o -path dir2 -o -path file1 ...
##		格式说明:	-o 表示 or  , -path 后面跟随目录(不需要最后的 / )
##					括号用 \(  \)
##	注意: 如果没有 with_mysql=1 参数,则会自动将 mysql 相关目录添加到过滤列表中
INOGE_DIR := 	-path "$(ROOT_DIR)v1/lib/myClientProtocolInterface"	\
			-o -path "$(ROOT_DIR)v1/LinuxTester"	\
			-o -path "$(ROOT_DIR)v1/VCTester"	\
			-o -path "$(ROOT_DIR)v1_tester"	\



##-- 额外需要参与编译的文件
#--    如果需要编译一个不在默认编译列表中的文件,则请加上.
#--		附:默认参与编译的文件:  MakeFile 目录下所有子目录所有 .cpp 文件( INOGE_DIR 所标记的文件/目录除外)
SOURCE_OTHER := 


					
##-- 设置需要额外连接的动态库. 
#-- 注意:区分多个版本,命名规则与工程后缀命名规则一致
#--      如果动态库不在MakeFile当前路径,则请提供完整路径,或设置 LIBS_PATH 的值.
#--      动态库可以加 -l 前缀, 如 -lstdc++ . 如果带有-l前缀,且该动态库是标准命名,则只需要写上名字即可.
#--	   连接器会自动补全动态库的名字.  如: -lstdc++  ,连接器会搜索  libstdc++.so 
#--	   如果不带 -l 前缀,又或者不是标准命名,则请提供完整的动态库名字. 如:  xx.so 

LIBS_so_		:= 
LIBS_so_x86w	:= 
LIBS_so_x86d	:= 
LIBS_so_x86wd	:= 
LIBS_so_x64		:=
LIBS_so_x64w	:= 
LIBS_so_x64d	:= 
LIBS_so_x64wd	:= 

#--  设置需要连接的静态库
##-- 注意:区分多个版本,命名规则与工程后缀命名规则一致
#--      如果动态库不在MakeFile当前路径,则请提供完整路径,或设置 LIBS_PATH 的值.

LIBS_a_			:= 
LIBS_a_x86w		:= 
LIBS_a_x86d		:= 
LIBS_a_x86wd	:= 
LIBS_a_x64		:=
LIBS_a_x64w		:= 
LIBS_a_x64d		:= 
LIBS_a_x64wd	:= 


####----- 32/64 位自适应(当没有定义 x86 和 x64 时)
ifdef x86
  ifdef x64
    $(error Error:Param 'x86' and 'x64' cannot exist at the same time)
  endif
else
  ifndef x64
    ifeq ($(shell getconf LONG_BIT), 64)
        x64 := 1
    endif
  endif
endif

##-- 编译额外参数:



########################################################################
####### 以下请勿修改 ###################################################
########################################################################



#---------- 解释命令行参数 ----------------------------------------

ifndef with_mysql
    ifdef INOGE_DIR
        INOGE_DIR := $(INOGE_DIR) -o
    endif
    INOGE_DIR := $(INOGE_DIR) -path ./v1/lib/myMysql	
endif

ifdef name
    PROJ_NAME = $(name)
endif

CFLAGS := -Wall -D_LINUX_  -std=c++11

ifdef debug
#	debug 版本忽略几个警告: 变量定义但未使用,
    CFLAGS += -g -D_DEBUG 
#	-Wunused-but-set-variable -Wunused-variable 
else
    CFLAGS += -O2
endif
ifdef  x64
    CFLAGS += -fPIC -D_X64 -m64 
else
    CFLAGS += -m32 
endif
ifdef unicode
    CFLAGS += -DUNICODE -D_UNICODE
endif


#-- 组合最终生成的文件名.
__name =
ifndef noflags
ifdef x64
    __name := $(__name)x64
endif
ifdef unicode
    __name :=$(__name)w
endif
ifdef debug
    __name:=$(__name)d
endif
endif
_FType := $(__name)
ifdef __name
    __name:=$(PROJ_NAME)_$(__name)
else
    __name:=$(PROJ_NAME)
endif
ifdef share
    __name:=$(__name).so
else
    __name:=$(__name).a    
endif
#__name = $(PROJ_NAME)
#-- 编译选择



#动态库
LIBS_SO := -lstdc++ -lpthread 
ifdef x64
  ifdef unicode
    ifdef debug
      LIBS_SO += $(LIBS_so_x64wd)
    else
      LIBS_SO += $(LIBS_so_x64w)    
    endif
  else
    ifdef debug
      LIBS_SO += $(LIBS_so_x64d)
    else
      LIBS_SO += $(LIBS_so_x64)    
    endif
  endif
else
  ifdef unicode
    ifdef debug
      LIBS_SO += $(LIBS_so_x86wd)
    else
      LIBS_SO += $(LIBS_so_x86w)    
    endif
  else
    ifdef debug
      LIBS_SO += $(LIBS_so_x86d)
    else
      LIBS_SO += $(LIBS_so_x86)    
    endif
  endif
endif  
    
#静态库
LIBS_A    := 
ifdef x64
  ifdef unicode
    ifdef debug
      LIBS_A += $(LIBS_a_x64wd)
    else
      LIBS_A += $(LIBS_a_x64w)    
    endif
  else
    ifdef debug
      LIBS_A += $(LIBS_a_x64d)
    else
      LIBS_A += $(LIBS_a_x64)    
    endif
  endif
else
  ifdef unicode
    ifdef debug
      LIBS_A += $(LIBS_a_x86wd)
    else
      LIBS_A += $(LIBS_a_x86w)    
    endif
  else
    ifdef debug
      LIBS_A += $(LIBS_a_x86d)
    else
      LIBS_A += $(LIBS_a_x86)    
    endif
  endif
endif  


#debug
#@echo mnnn
#echo "lib_so  $(LIBS_SO)
#echo "lib_a  $(LIBS_A)


#设置跳过的目录或文件
ifneq ($(INOGE_DIR),)
    INOGE_DIR := \( $(INOGE_DIR) \) -prune -o 
endif

#echo $(INOGE_DIR)

#搜索需要参与编译的文件

SRC_DIR = ./v1/lib/myThread
#SRC_DIR = .


SFile1 := $(shell find $(SRC_DIR) $(INOGE_DIR) -name "*.cpp" -print )
#echo $(SFile1)

#文件最后处理
SRCS:= $(SFile1) $(SOURCE_OTHER)
_FType:= %_$(_FType).o
OBJS := $(patsubst %.cpp,$(_FType),$(SRCS))


#--- cleanall 处理
SFile_clean := $(shell find $(SRC_DIR) -name "*.cpp" -print )
SRCS_clean:= $(SFile_clean) $(SOURCE_OTHER)

_src_clean1:=$(patsubst %.cpp,%_.o,$(SRCS_clean))
_src_clean2:=$(patsubst %.cpp,%_w.o,$(SRCS_clean))
_src_clean3:=$(patsubst %.cpp,%_d.o,$(SRCS_clean))
_src_clean4:=$(patsubst %.cpp,%_wd.o,$(SRCS_clean))
_src_clean5:=$(patsubst %.cpp,%_x64.o,$(SRCS_clean))
_src_clean6:=$(patsubst %.cpp,%_x64w.o,$(SRCS_clean))
_src_clean7:=$(patsubst %.cpp,%_x64d.o,$(SRCS_clean))
_src_clean8:=$(patsubst %.cpp,%_x64wd.o,$(SRCS_clean))



#搜索头文件依赖关系
_makedepend :=
_DependFile :=
ifeq ($(no_chk_hfile),)
    _makedepend = g++  -std=c++11 -I. $(INCLUDE) -M $(SRCS)  > $(_DependFile)  
endif

Depends_cpp:=$(SRCS:.cpp=.d)
DEPS:= $(Depends_cpp)



#======= 编译
all: $(__name)
	@echo \*********************************************************
	@echo \****  Build $(__name) Success!
#	@echo \****  ProjectName: $(__name)
	@echo \****  EndTime: $(shell date)
	@echo \*********************************************************

$(__name):$(OBJS)
	$(CC) -shared -o $(__name) $(OBJS) $(LIBS_A) $(LIBS_SO)


#%.o:%.cpp 
$(_FType):%.cpp
	$(CC) $(CFLAGS) -c $< -o $@ -I. $(INCLUDE)
	

$(SRCS):print_info
	
	
print_info:
	@echo \*********************************************************
	@echo \****  ProjectName: $(__name)
	@echo \****  StartTime: $(shell date)
	@echo \*********************************************************
	
	
clean:
	-rm -f $(OBJS) $(DEPS)
	-rm -f *~
	
cleanall:
	-rm -f $(_src_clean1)
	-rm -f $(_src_clean2)
	-rm -f $(_src_clean3)
	-rm -f $(_src_clean4)
	-rm -f $(_src_clean5)
	-rm -f $(_src_clean6)
	-rm -f $(_src_clean7)
	-rm -f $(_src_clean8)
	-rm -f $(DEPS)
	-rm -f *~

	
	